home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Gloom_3 / src / 040_1.s < prev    next >
Text File  |  1997-08-26  |  26KB  |  974 lines

  1.  
  2.         machine 68040
  3.  
  4. NEWCODE EQU 1
  5.  
  6.         bra.w    initc2p     ; offset 0: initialization routines
  7.         bra.w    doc2p_1X8    ; offset 4: one pixel wide version, AGA
  8.         bra.w    doc2p_1X6    ; offset 8: one pixel wide version, EHB
  9.         bra.w    doc2p_2X8    ; offset 12: two pixel wide version, AGA
  10.         bra.w    doc2p_2X6    ; offset 16: two pixel wide version, EHB
  11.         dc.l    string        ; offset 20: address of descr string
  12.  
  13.         dc.b    '$VER: 040_1 1.0 (4/1/96)',0
  14. string        dc.b    'A chunky to planar routine by Peter McGavin. '
  15.         dc.b    'Changes by Iain Barclay. '
  16.         dc.b    'Optimised for 68040 with 32-bit chipmem. '
  17.         dc.b    'Supports 6/8 bitplane, single/double width pixels.',0
  18.         even
  19.  
  20. initc2p
  21.  
  22. ; create 2 tables for Gloom
  23.  
  24. ; a0=columns buffer to fill in (array of longs) for 1 wide pixs.
  25. ; a1=columns buffer for 2 wide pixs
  26. ; d0=how many columns (multiple of 32)
  27. ; a2=palette remapping array (do 256)
  28.  
  29.         move.w    #255,d1 ;#colours-1
  30. .loop        move.b    d1,(a2,d1.w)
  31.         dbf    d1,.loop
  32.  
  33. ; column offsets for 1 wide pixels
  34.  
  35. ; 0,4,8,12,16,20,24,28,1,5,9,13,17,21,25,29
  36. ; 2,6,10,14,18,22,26,30,3,7,11,15,19,23,27,31
  37. ; 32,36,40,...
  38.  
  39.         move.l    d0,d4
  40.         lsr.w    #5,d4
  41.         subq.w    #1,d4
  42.         moveq    #0,d1
  43. .loop0        moveq    #3,d2
  44. .loop1        moveq    #7,d3
  45. .loop2        move.l    d1,(a0)+
  46.         addq.l    #4,d1
  47.         dbf    d3,.loop2
  48.         sub.l    #31,d1
  49.         dbf    d2,.loop1
  50.         add.l    #28,d1
  51.         dbf    d4,.loop0
  52.  
  53. ; column offsets for 2 wide pixels
  54.  
  55. ; 0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15,
  56. ; 16,20,24,28,17,...
  57.  
  58.         lsr.w    #4,d0
  59.         subq.w    #1,d0
  60.         moveq    #0,d1
  61. .loop3        moveq    #3,d2
  62. .loop4        moveq    #3,d3
  63. .loop5        move.l    d1,(a1)+
  64.         addq.l    #4,d1
  65.         dbf    d3,.loop5
  66.         sub.l    #15,d1
  67.         dbf    d2,.loop4
  68.         add.l    #12,d1
  69.         dbf    d0,.loop3
  70.  
  71.         rts
  72.  
  73. ; macros for 1x8 and 1x6 routines
  74. ; merge \1,\2, d6/d7 are scratch, \3 = mask, \4 = shift
  75.  
  76. merge1        macro
  77.         move.l    \1,d6
  78.         and.l    #\3,\1
  79.         eor.l    \1,d6
  80.         move.l    \2,d7
  81.         endm
  82.  
  83. merge2        macro
  84.         and.l    #\3,d7
  85.         eor.l    d7,\2
  86.         lsr.l    #\4,d7
  87.         endm
  88.  
  89. merge3        macro
  90.         ifeq    \4-1
  91.         add.l    d6,d6
  92.         else
  93.         lsl.l    #\4,d6
  94.         endc
  95.         or.l    d7,\1
  96.         or.l    d6,\2
  97.         endm
  98.  
  99. merge        macro
  100.         merge1    \1,\2,\3,\4
  101.         merge2    \1,\2,\3,\4
  102.         merge3    \1,\2,\3,\4
  103.         endm
  104.  
  105.         cnop    0,8
  106. doc2p_1X8
  107. ; inputs:
  108. ; a0.l=src chunky buffer
  109. ; a1.l=dest chipmem bitmap
  110. ; d0.w=width (in pixels - multiple of 32) to convert
  111. ; d1.w=height (in pixels - even)
  112. ; d2.l=modulo from one bitplane to next (copmod-ish)
  113. ; d3.l=modulo from start of one line to start of next (linemod)
  114.  
  115. ; internal:
  116. ; a2=bitplane modulo, 1 bp to next
  117. ; d6/d7 used as scratch by merge macro
  118.  
  119.         suba.w    #32,sp
  120.         movea.l d2,a2        ; a2 = bpmod
  121.         move.l    d2,d4
  122.         lsl.l    #3,d4
  123.         sub.l    d2,d4        ; d4 = 7 * bpmod
  124.         adda.l    d4,a1        ; a1 -> plane 7
  125.  
  126.         addq.l    #4,d4
  127.         movea.l d4,a5        ; a5 = 7 * bpmod + 4
  128.         move.l    a5,-(sp)    ; (8,sp) = 7 * bpmod + 4
  129.  
  130.         move.w    d0,d4
  131.         lsr.w    #5,d4        ; d4 = num 32 pix per row
  132.         subq.w    #1,d4
  133.         ext.l    d4
  134.         move.l    d4,-(sp)    ; (4,sp) = num 32 pix per row - 1
  135.  
  136.         lsr.w    #3,d0        ; num 8 pix per row (bytesperrow)
  137.         ext.l    d0
  138.         sub.l    d0,d3        ; linemod - bytesperrow
  139.         add.l    a5,d3
  140.         move.l    d3,-(sp)    ; (sp) = linemod-bytesperrow+7*bpmod+4
  141.  
  142.         move.w    d1,d7
  143.         subq.w    #1,d7        ; d7 = height - 1
  144.  
  145. ;------------------------------------------------------------------------
  146. ;
  147. ; Original pixels
  148. ;00       a7a6a5a4a3a2a1a0 i7i6i5i4i3i2i1i0 q7q6q5q4q3q2q1q0 y7y6y5y4y3y2y1y0
  149. ;01       b7b6b5b4b3b2b1b0 j7j6j5j4j3j2j1j0 r7r6r5r4r3r2r1r0 z7z6z5z4z3z2z1z0
  150. ;02       c7c6c5c4c3c2c1c0 k7k6k5k4k3k2k1k0 s7s6s5s4s3s2s1s0 A7A6A5A4A3A2A1A0
  151. ;03       d7d6d5d4d3d2d1d0 l7l6l5l4l3l2l1l0 t7t6t5t4t3t2t1t0 B7B6B5B4B3B2B1B0
  152. ;04       e7e6e5e4e3e2e1e0 m7m6m5m4m3m2m1m0 u7u6u5u4u3u2u1u0 C7C6C5C4C3C2C1C0
  153. ;05       f7f6f5f4f3f2f1f0 n7n6n5n4n3n2n1n0 v7v6v5v4v3v2v1v0 D7D6D5D4D3D2D1D0
  154. ;06       g7g6g5g4g3g2g1g0 o7o6o5o4o3o2o1o0 w7w6w5w4w3w2w1w0 E7E6E5E4E3E2E1E0
  155. ;07       h7h6h5h4h3h2h1h0 p7p6p5p4p3p2p1p0 x7x6x5x4x3x2x1x0 F7F6F5F4F3F2F1F0
  156. ;
  157. ; After 4bit merge
  158. ;10=00x04a a7a6a5a4e7e6e5e4 i7i6i5i4m7m6m5m4 q7q6q5q4u7u6u5u4 y7y6y5y4C7C6C5C4
  159. ;11=00x04b a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0 q3q2q1q0u3u2u1u0 y3y2y1y0C3C2C1C0
  160. ;12=01x05a b7b6b5b4f7f6f5f4 j7j6j5j4n7n6n5n4 r7r6r5r4v7v6v5v4 z7z6z5z4D7D6D5D4
  161. ;13=01x05b b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0 r3r2r1r0v3v2v1v0 z3z2z1z0D3D2D1D0
  162. ;14=02x06a c7c6c5c4g7g6g5g4 k7k6k5k4o7o6o5o4 s7s6s5s4w7w6w5w4 A7A6A5A4E7E6E5E4
  163. ;15=02x06b c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0 s3s2s1s0w3w2w1w0 A3A2A1A0E3E2E1E0
  164. ;16=03x07a d7d6d5d4h7h6h5h4 l7l6l5l4p7p6p5p4 t7t6t5t4x7x6x5x4 B7B6B5B4F7F6F5F4
  165. ;17=03x07b d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0 t3t2t1t0x3x2x1x0 B3B2B1B0F3F2F1F0
  166. ;
  167. ; After 2bit merge
  168. ;20=10x14a a7a6c7c6e7e6g7g6 i7i6k7k6m7m6o7o6 q7q6s7s6u7u6w7w6 y7y6A7A6C7C6E7E6
  169. ;21=10x14b a5a4c5c4e5e4g5g4 i5i4k5k4m5m4o5o4 q5q4s5s4u5u4w5w4 y5y4A5A4C5C4E5E4
  170. ;22=11x15a a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2 q3q2s3s2u3u2w3w2 y3y2A3A2C3C2E3E2
  171. ;23=11x15b a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0 q1q0s1s0u1u0w1w0 y1y0A1A0C1C0E1E0
  172. ;24=12x16a b7b6d7d6f7f6h7h6 j7j6l7l6n7n6p7p6 r7r6t7t6v7v6x7x6 z7z6B7B6D7D6F7F6
  173. ;25=12x16b b5b4d5d4f5f4h5h4 j5j4l5l4n5n4p5p4 r5r4t5t4v5v4x5x4 z5z4B5B4D5D4F5F4
  174. ;26=13x17a b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2 r3r2t3t2v3v2x3x2 z3z2B3B2D3D2F3F2
  175. ;27=13x17b b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0 r1r0t1t0v1v0x1x0 z1z0B1B0D1D0F1F0
  176. ;
  177. ; After 1bit merge
  178. ;30=20x24a a7b7c7d7e7f7g7h7 i7j7k7l7m7n7o7p7 q7r7s7t7u7v7w7x7 y7z7A7B7C7D7E7F7
  179. ;31=20x24b a6b6c6d6e6f6g6h6 i6j6k6l6m6n6o6p6 q6r6s6t6u6v6w6x6 y6z6A6B6C6D6E6F6
  180. ;32=21x25a a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5 q5r5s5t5u5v5w5x5 y5z5A5B5C5D5E5F5
  181. ;33=21x25b a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4 q4r4s4t4u4v4w4x4 y4z4A4B4C4D4E4F4
  182. ;34=22x26a a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3 q3r3s3t3u3v3w3x3 y3z3A3B3C3D3E3F3
  183. ;35=22x26b a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2 q2r2s2t2u2v2w2x2 y2z2A2B2C2D2E2F2
  184. ;36=23x27a a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1 q1r1s1t1u1v1w1x1 y1z1A1B1C1D1E1F1
  185. ;37=23x27b a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0 q0r0s0t0u0v0w0x0 y0z0A0B0C0D0E0F0
  186. ;
  187. ;------------------------------------------------------------------------
  188.  
  189.         swap    d7
  190.         move.w    d4,d7            ; number of 32 pixels per row - 1
  191.  
  192.         exg    d7,a6
  193.  
  194.         movem.l (a0)+,d0-d5/a3-a4    ; read first 32 pixels into regs
  195.  
  196.         merge    d0,d4,$f0f0f0f0,4    ; 00x04 -> 10 11
  197.         merge    d1,d5,$f0f0f0f0,4    ; 01x05 -> 12 13
  198.         exg    d1,a3
  199.         exg    d5,a4
  200.         merge    d2,d1,$f0f0f0f0,4    ; 02x06 -> 14 15
  201.         merge    d3,d5,$f0f0f0f0,4    ; 03x07 -> 16 17
  202.  
  203.         merge    d0,d2,$cccccccc,2    ; 10x14 -> 20 21
  204.         merge    d4,d1,$cccccccc,2    ; 11x15 -> 22 23
  205.         exg    d4,a3
  206.         exg    d1,a4
  207.         merge    d4,d3,$cccccccc,2    ; 12x16 -> 24 25
  208.         merge    d1,d5,$cccccccc,2    ; 13x17 -> 26 27
  209.  
  210.         merge    d0,d4,$aaaaaaaa,1    ; 20x24 -> 30 31
  211.         merge    d2,d3,$aaaaaaaa,1    ; 21x25 -> 32 33
  212.         exg    d2,a3
  213.         exg    d3,a4
  214.         merge    d2,d1,$aaaaaaaa,1    ; 22x26 -> 34 35
  215.  
  216.         bra    .same_from_here
  217.  
  218.         cnop    0,8
  219.  
  220. .outerloop    swap    d7
  221.         move.w    (6,sp),d7    ; number of 32 pixels per row - 1
  222.  
  223. .innerloop    exg    d7,a6
  224.  
  225.         move.l    (a0)+,d0    ; next 4 pixels
  226.         move.l    (a0)+,d1    ; next 4 pixels
  227.         move.l    (a0)+,d2    ; next 4 pixels
  228.         move.l    (a0)+,d3    ; next 4 pixels
  229.         move.l    (a0)+,d4    ; next 4 pixels
  230.         move.l    (a0)+,d5    ; next 4 pixels
  231.         move.l    (a0)+,a3    ; next 4 pixels
  232.         move.l    (a0)+,a4    ; next 4 pixels
  233.  
  234.         move.l    (6*4+12,sp),(a1)    ; plane 6
  235.         suba.l    a2,a1            ; -bpmod
  236.  
  237.         merge    d0,d4,$f0f0f0f0,4    ; 00x04 -> 10 11
  238.         merge    d1,d5,$f0f0f0f0,4    ; 01x05 -> 12 13
  239.  
  240.         exg    d1,a3
  241.         exg    d5,a4
  242.  
  243.         move.l    (5*4+12,sp),(a1)    ; plane 5
  244.         suba.l    a2,a1            ; -bpmod
  245.  
  246.         merge    d2,d1,$f0f0f0f0,4    ; 02x06 -> 14 15
  247.         merge    d3,d5,$f0f0f0f0,4    ; 03x07 -> 16 17
  248.         merge1    d0,d2,$cccccccc,2    ; 10x14 -> 20 21
  249.         merge2    d0,d2,$cccccccc,2    ; 10x14 -> 20 21
  250.  
  251.         move.l    (4*4+12,sp),(a1)    ; plane 4
  252.         suba.l    a2,a1            ; -bpmod
  253.  
  254.         merge3    d0,d2,$cccccccc,2    ; 10x14 -> 20 21
  255.         merge    d4,d1,$cccccccc,2    ; 11x15 -> 22 23
  256.         exg    d4,a3
  257.         exg    d1,a4
  258.         merge    d4,d3,$cccccccc,2    ; 12x16 -> 24 25
  259.  
  260.         move.l    (3*4+12,sp),(a1)    ; plane 3
  261.         suba.l    a2,a1            ; -bpmod
  262.  
  263.         merge1    d1,d5,$cccccccc,2    ; 13x17 -> 26 27
  264.         merge2    d1,d5,$cccccccc,2    ; 13x17 -> 26 27
  265.         merge3    d1,d5,$cccccccc,2    ; 13x17 -> 26 27
  266.         merge    d0,d4,$aaaaaaaa,1    ; 20x24 -> 30 31
  267.  
  268.         move.l    (2*4+12,sp),(a1)    ; plane 2
  269.         suba.l    a2,a1            ; -bpmod
  270.  
  271.         merge    d2,d3,$aaaaaaaa,1    ; 21x25 -> 32 33
  272.         exg    d2,a3
  273.         exg    d3,a4
  274.         merge1    d2,d1,$aaaaaaaa,1    ; 22x26 -> 34 35
  275.         merge2    d2,d1,$aaaaaaaa,1    ; 22x26 -> 34 35
  276.  
  277.         move.l    (1*4+12,sp),(a1)    ; plane 1
  278.         suba.l    a2,a1            ; -bpmod
  279.  
  280.         merge3    d2,d1,$aaaaaaaa,1    ; 22x26 -> 34 35
  281.  
  282.         move.l    (0*4+12,sp),(a1)    ; plane 0
  283.         adda.l    a5,a1            ; {dest skip}+7*bpmod+4
  284.         move.l    (8,sp),a5        ; a5 = 7*bpmod+4
  285.  
  286. .same_from_here merge    d3,d5,$aaaaaaaa,1    ; 23x27 -> 36 37
  287.  
  288.         move.l    d5,(0*4+12,sp)        ; 37 -> plane 0 buffer
  289.         move.l    d3,(1*4+12,sp)        ; 36 -> plane 1 buffer
  290.         move.l    d1,(2*4+12,sp)        ; 35 -> plane 2 buffer
  291.         move.l    d2,(3*4+12,sp)        ; 34 -> plane 3 buffer
  292.         move.l    a4,(4*4+12,sp)        ; 33 -> plane 4 buffer
  293.         move.l    a3,(5*4+12,sp)        ; 32 -> plane 5 buffer
  294.         move.l    d4,(6*4+12,sp)        ; 31 -> plane 6 buffer
  295.         move.l    d0,(a1)         ; 30 -> plane 7
  296.         suba.l    a2,a1
  297.  
  298.         exg    a6,d7
  299.         dbra    d7,.innerloop
  300.  
  301.         move.l    (sp),a5     ; a5 = dest skip + 7 * bpmod + 4
  302.  
  303.         swap    d7
  304.         dbra    d7,.outerloop
  305.  
  306.         move.l    (6*4+12,sp),(a1)    ; plane 6
  307.         suba.l    a2,a1            ; -bpmod
  308.         move.l    (5*4+12,sp),(a1)    ; plane 5
  309.         suba.l    a2,a1            ; -bpmod
  310.         move.l    (4*4+12,sp),(a1)    ; plane 4
  311.         suba.l    a2,a1            ; -bpmod
  312.         move.l    (3*4+12,sp),(a1)    ; plane 3
  313.         suba.l    a2,a1            ; -bpmod
  314.         move.l    (2*4+12,sp),(a1)    ; plane 2
  315.         suba.l    a2,a1            ; -bpmod
  316.         move.l    (1*4+12,sp),(a1)    ; plane 1
  317.         suba.l    a2,a1            ; -bpmod
  318.         move.l    (0*4+12,sp),(a1)    ; plane 0
  319.         adda.w    #12+32,sp
  320.         rts
  321.  
  322.         cnop    0,8
  323. doc2p_1X6
  324. ; inputs:
  325. ; a0.l=src chunky buffer
  326. ; a1.l=dest chipmem bitmap
  327. ; d0.w=width (in pixels - multiple of 32) to convert
  328. ; d1.w=height (in pixels - even)
  329. ; d2.l=modulo from one bitplane to next (copmod-ish)
  330. ; d3.l=modulo from start of one line to start of next (linemod)
  331.  
  332. ; internal:
  333. ; a2=bitplane modulo, 1 bp to next
  334. ; d6/d7 used as scratch by merge macro
  335.  
  336.         suba.w    #32,sp
  337.         movea.l d2,a2        ; a2 = bpmod
  338.         move.l    d2,d4
  339.         lsl.l    #2,d4
  340.         add.l    d2,d4        ; d4 = 5 * bpmod
  341.         adda.l    d4,a1        ; a1 -> plane 5
  342.  
  343.         addq.l    #4,d4
  344.         movea.l d4,a5        ; a5 = 5 * bpmod + 4
  345.         move.l    a5,-(sp)    ; (8,sp) = 5 * bpmod + 4
  346.  
  347.         move.w    d0,d4
  348.         lsr.w    #5,d4        ; d4 = num 32 pix per row
  349.         subq.w    #1,d4
  350.         ext.l    d4
  351.         move.l    d4,-(sp)    ; (4,sp) = num 32 pix per row - 1
  352.  
  353.         lsr.w    #3,d0        ; num 8 pix per row (bytesperrow)
  354.         ext.l    d0
  355.         sub.l    d0,d3        ; linemod - bytesperrow
  356.         add.l    a5,d3
  357.         move.l    d3,-(sp)    ; (sp) = linemod-bytesperrow+5*bpmod+4
  358.  
  359.         move.w    d1,d7
  360.         subq.w    #1,d7        ; d7 = height - 1
  361.  
  362. ;------------------------------------------------------------------------
  363. ;
  364. ; Original pixels
  365. ;00       ....a5a4a3a2a1a0 ....i5i4i3i2i1i0 ....q5q4q3q2q1q0 ....y5y4y3y2y1y0
  366. ;01       ....b5b4b3b2b1b0 ....j5j4j3j2j1j0 ....r5r4r3r2r1r0 ....z5z4z3z2z1z0
  367. ;02       ....c5c4c3c2c1c0 ....k5k4k3k2k1k0 ....s5s4s3s2s1s0 ....A5A4A3A2A1A0
  368. ;03       ....d5d4d3d2d1d0 ....l5l4l3l2l1l0 ....t5t4t3t2t1t0 ....B5B4B3B2B1B0
  369. ;04       ....e5e4e3e2e1e0 ....m5m4m3m2m1m0 ....u5u4u3u2u1u0 ....C5C4C3C2C1C0
  370. ;05       ....f5f4f3f2f1f0 ....n5n4n3n2n1n0 ....v5v4v3v2v1v0 ....D5D4D3D2D1D0
  371. ;06       ....g5g4g3g2g1g0 ....o5o4o3o2o1o0 ....w5w4w3w2w1w0 ....E5E4E3E2E1E0
  372. ;07       ....h5h4h3h2h1h0 ....p5p4p3p2p1p0 ....x5x4x3x2x1x0 ....F5F4F3F2F1F0
  373. ;
  374. ; After 4bit merge
  375. ;10=00x04a ....a5a4....e5e4 ....i5i4....m5m4 ....q5q4....u5u4 ....y5y4....C5C4
  376. ;11=00x04b a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0 q3q2q1q0u3u2u1u0 y3y2y1y0C3C2C1C0
  377. ;12=01x05a ....b5b4....f5f4 ....j5j4....n5n4 ....r5r4....v5v4 ....z5z4....D5D4
  378. ;13=01x05b b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0 r3r2r1r0v3v2v1v0 z3z2z1z0D3D2D1D0
  379. ;14=02x06a ....c5c4....g5g4 ....k5k4....o5o4 ....s5s4....w5w4 ....A5A4....E5E4
  380. ;15=02x06b c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0 s3s2s1s0w3w2w1w0 A3A2A1A0E3E2E1E0
  381. ;16=03x07a ....d5d4....h5h4 ....l5l4....p5p4 ....t5t4....x5x4 ....B5B4....F5F4
  382. ;17=03x07b d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0 t3t2t1t0x3x2x1x0 B3B2B1B0F3F2F1F0
  383. ;
  384. ; After 2bit merge
  385. ;21=10x14b a5a4c5c4e5e4g5g4 i5i4k5k4m5m4o5o4 q5q4s5s4u5u4w5w4 y5y4A5A4C5C4E5E4
  386. ;22=11x15a a3a2c3c2e3e2g3g2 i3i2k3k2m3m2o3o2 q3q2s3s2u3u2w3w2 y3y2A3A2C3C2E3E2
  387. ;23=11x15b a1a0c1c0e1e0g1g0 i1i0k1k0m1m0o1o0 q1q0s1s0u1u0w1w0 y1y0A1A0C1C0E1E0
  388. ;25=12x16b b5b4d5d4f5f4h5h4 j5j4l5l4n5n4p5p4 r5r4t5t4v5v4x5x4 z5z4B5B4D5D4F5F4
  389. ;26=13x17a b3b2d3d2f3f2h3h2 j3j2l3l2n3n2p3p2 r3r2t3t2v3v2x3x2 z3z2B3B2D3D2F3F2
  390. ;27=13x17b b1b0d1d0f1f0h1h0 j1j0l1l0n1n0p1p0 r1r0t1t0v1v0x1x0 z1z0B1B0D1D0F1F0
  391. ;
  392. ; After 1bit merge
  393. ;32=21x25a a5b5c5d5e5f5g5h5 i5j5k5l5m5n5o5p5 q5r5s5t5u5v5w5x5 y5z5A5B5C5D5E5F5
  394. ;33=21x25b a4b4c4d4e4f4g4h4 i4j4k4l4m4n4o4p4 q4r4s4t4u4v4w4x4 y4z4A4B4C4D4E4F4
  395. ;34=22x26a a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3 q3r3s3t3u3v3w3x3 y3z3A3B3C3D3E3F3
  396. ;35=22x26b a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2 q2r2s2t2u2v2w2x2 y2z2A2B2C2D2E2F2
  397. ;36=23x27a a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1 q1r1s1t1u1v1w1x1 y1z1A1B1C1D1E1F1
  398. ;37=23x27b a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0 q0r0s0t0u0v0w0x0 y0z0A0B0C0D0E0F0
  399. ;
  400. ;------------------------------------------------------------------------
  401.  
  402.         swap    d7
  403.         move.w    d4,d7            ; number of 32 pixels per row - 1
  404.  
  405.         exg    d7,a6
  406.  
  407.         movem.l (a0)+,d0-d5/a3-a4    ; read first 32 pixels into regs
  408.  
  409.         merge    d0,d4,$f0f0f0f0,4    ; 00x04 -> 10 11
  410.         merge    d1,d5,$f0f0f0f0,4    ; 01x05 -> 12 13
  411.         exg    d1,a3
  412.         exg    d5,a4
  413.         merge    d2,d1,$f0f0f0f0,4    ; 02x06 -> 14 15
  414.         merge    d3,d5,$f0f0f0f0,4    ; 03x07 -> 16 17
  415.  
  416.         lsl.l    #2,d0
  417.         or.l    d0,d2            ; 10x14 ->    21
  418.         merge    d4,d1,$cccccccc,2    ; 11x15 -> 22 23
  419.         exg    d4,a3
  420.         exg    d1,a4
  421.         lsl.l    #2,d4
  422.         or.l    d4,d3            ; 12x16 ->    25
  423.         merge    d1,d5,$cccccccc,2    ; 13x17 -> 26 27
  424.  
  425.         merge    d2,d3,$aaaaaaaa,1    ; 21x25 -> 32 33
  426.         exg    d2,a3
  427.         exg    d3,a4
  428.         merge    d2,d1,$aaaaaaaa,1    ; 22x26 -> 34 35
  429.         merge    d3,d5,$aaaaaaaa,1    ; 23x27 -> 36 37
  430.  
  431.         bra    .same_from_here
  432.  
  433.         cnop    0,8
  434.  
  435. .outerloop    swap    d7
  436.         move.w    (6,sp),d7    ; number of 32 pixels per row - 1
  437.  
  438. .innerloop    exg    d7,a6
  439.  
  440.         move.l    (a0)+,d0    ; next 4 pixels
  441.         move.l    (a0)+,d1    ; next 4 pixels
  442.         move.l    (a0)+,d2    ; next 4 pixels
  443.         move.l    (a0)+,d3    ; next 4 pixels
  444.         move.l    (a0)+,d4    ; next 4 pixels
  445.         move.l    (a0)+,d5    ; next 4 pixels
  446.         move.l    (a0)+,a3    ; next 4 pixels
  447.         move.l    (a0)+,a4    ; next 4 pixels
  448.  
  449.         move.l    (4*4+12,sp),(a1)    ; plane 4
  450.         suba.l    a2,a1            ; -bpmod
  451.  
  452.         merge    d0,d4,$f0f0f0f0,4    ; 00x04 -> 10 11
  453.         merge    d1,d5,$f0f0f0f0,4    ; 01x05 -> 12 13
  454.  
  455.         move.l    (3*4+12,sp),(a1)    ; plane 3
  456.         suba.l    a2,a1            ; -bpmod
  457.  
  458.         exg    d1,a3
  459.         exg    d5,a4
  460.         merge    d2,d1,$f0f0f0f0,4    ; 02x06 -> 14 15
  461.         merge    d3,d5,$f0f0f0f0,4    ; 03x07 -> 16 17
  462.         lsl.l    #2,d0
  463.         or.l    d0,d2            ; 10x14 ->    21
  464.  
  465.         move.l    (2*4+12,sp),(a1)    ; plane 2
  466.         suba.l    a2,a1            ; -bpmod
  467.  
  468.         merge    d4,d1,$cccccccc,2    ; 11x15 -> 22 23
  469.         exg    d4,a3
  470.         exg    d1,a4
  471.         lsl.l    #2,d4
  472.         or.l    d4,d3            ; 12x16 ->    25
  473.  
  474.         move.l    (1*4+12,sp),(a1)    ; plane 1
  475.         suba.l    a2,a1            ; -bpmod
  476.  
  477.         merge    d1,d5,$cccccccc,2    ; 13x17 -> 26 27
  478.         merge    d2,d3,$aaaaaaaa,1    ; 21x25 -> 32 33
  479.         exg    d2,a3
  480.         exg    d3,a4
  481.  
  482.         move.l    (0*4+12,sp),(a1)    ; plane 0
  483.         adda.l    a5,a1            ; {dest skip}+5*bpmod+4
  484.  
  485.         merge    d2,d1,$aaaaaaaa,1    ; 22x26 -> 34 35
  486.         merge    d3,d5,$aaaaaaaa,1    ; 23x27 -> 36 37
  487.  
  488.         move.l    (8,sp),a5        ; a5 = 5*bpmod+4
  489.  
  490. .same_from_here move.l    d5,(0*4+12,sp)        ; 37 -> plane 0 buffer
  491.         move.l    d3,(1*4+12,sp)        ; 36 -> plane 1 buffer
  492.         move.l    d1,(2*4+12,sp)        ; 35 -> plane 2 buffer
  493.         move.l    d2,(3*4+12,sp)        ; 34 -> plane 3 buffer
  494.         move.l    a4,(4*4+12,sp)        ; 33 -> plane 4 buffer
  495.         move.l    a3,(a1)         ; 32 -> plane 5
  496.         suba.l    a2,a1
  497.  
  498.         exg    a6,d7
  499.         dbra    d7,.innerloop
  500.  
  501.         move.l    (sp),a5     ; a5 = dest skip + 5 * bpmod + 4
  502.  
  503.         swap    d7
  504.         dbra    d7,.outerloop
  505.  
  506.         move.l    (4*4+12,sp),(a1)    ; plane 4
  507.         suba.l    a2,a1            ; -bpmod
  508.         move.l    (3*4+12,sp),(a1)    ; plane 3
  509.         suba.l    a2,a1            ; -bpmod
  510.         move.l    (2*4+12,sp),(a1)    ; plane 2
  511.         suba.l    a2,a1            ; -bpmod
  512.         move.l    (1*4+12,sp),(a1)    ; plane 1
  513.         suba.l    a2,a1            ; -bpmod
  514.         move.l    (0*4+12,sp),(a1)    ; plane 0
  515.         adda.w    #12+32,sp
  516.         rts
  517.  
  518.         cnop    0,8
  519. doc2p_2X8
  520. ; inputs:
  521. ; a0.l=src chunky buffer
  522. ; a1.l=dest chipmem bitmap
  523. ; d0.w=width (in pixels - multiple of 32) to convert
  524. ; d1.w=height (in pixels - even)
  525. ; d2.l=modulo from one bitplane to next (copmod-ish)
  526. ; d3.l=modulo from start of one line to start of next (linemod)
  527.  
  528. ; Pipelined without fastmem buffers
  529.  
  530.         movea.l d2,a6        ; a6 = bpmod
  531.         move.l    d2,d4
  532.         lsl.l    #3,d4
  533.         sub.l    d2,d4
  534.         neg.l    d4
  535.         addq.l    #4,d4
  536.         movea.l d4,a3        ; a3 = -7*bpmod+4
  537.         movea.l d4,a4        ; a4 = -7*bpmod+4
  538.         lsr.w    #4,d0
  539.         movea.w d0,a2
  540.         subq.l    #1,a2        ; a2 = num 16 pix per row - 1
  541.         lsl.w    #2,d0        ; d0 = num 4 pix per row (bytesperrow)
  542.         movea.l d3,a5
  543.         suba.w    d0,a5
  544.         adda.l    a3,a5        ; a5 = linemod-bytesperrow-7*bpmod+4
  545.         move.w    d1,d7
  546.         subq.w    #1,d7        ; d7 = height - 1
  547.  
  548. ;------------------------------------------------------------------------
  549. ; original pixels
  550. ; 00        a7a6a5a4a3a2a1a0 e7e6e5e4e3e2e1e0 i7i6i5i4i3i2i1i0 m7m6m5m4m3m2m1m0
  551. ; 01        b7b6b5b4b3b2b1b0 f7f6f5f4f3f2f1f0 j7j6j5j4j3j2j1j0 n7n6n5n4n3n2n1n0
  552. ; 02        c7c6c5c4c3c2c1c0 g7g6g5g4g3g2g1g0 k7k6k5k4k3k2k1k0 o7o6o5o4o3o2o1o0
  553. ; 03        d7d6d5d4d3d2d1d0 h7h6h5h4h3h2h1h0 l7l6l5l4l3l2l1l0 p7p6p5p4p3p2p1p0
  554. ;
  555. ; after 4bit merge
  556. ; 10 00x02a a7a6a5a4c7c6c5c4 e7e6e5e4g7g6g5g4 i7i6i5i4k7k6k5k4 m7m6m5m4o7o6o5o4
  557. ; 11 00x02b a3a2a1a0c3c2c1c0 e3e2e1e0g3g2g1g0 i3i2i1i0k3k2k1k0 m3m2m1m0o3o2o1o0
  558. ; 12 01x03a b7b6b5b4d7d6d5d4 f7f6f5f4h7h6h5h4 j7j6j5j4l7l6l5l4 n7n6n5n4p7p6p5p4
  559. ; 13 01x03b b3b2b1b0d3d2d1d0 f3f2f1f0h3h2h1h0 j3j2j1j0l3l2l1l0 n3n2n1n0p3p2p1p0
  560. ;
  561. ; after 2bit merge
  562. ; 20 10x12a a7a6b7b6c7c6d7d6 e7e6f7f6g7g6h7h6 i7i6j7j6k7k6l7l6 m7m6n7n6o7o6p7p6
  563. ; 21 10x12b a5a4b5b4c5c4d5d4 e5e4f5f4g5g4h5h4 i5i4j5j4k5k4l5l4 m5m4n5n4o5o4p5p4
  564. ; 22 11x13a a3a2b3b2c3c2d3d2 e3e2f3f2g3g2h3h2 i3i2j3j2k3k2l3l2 m3m2n3n2o3o2p3p2
  565. ; 23 11x13b a1a0b1b0c1c0d1d0 e1e0f1f0g1g0h1h0 i1i0j1j0k1k0l1l0 m1m0n1n0o1o0p1p0
  566. ;
  567. ; after 1bit merge
  568. ; 30 20x20a a7a7b7b7c7c7d7d7 e7e7f7f7g7g7h7h7 i7i7j7j7k7k7l7l7 m7m7n7n7o7o7p7p7
  569. ; 31 20x20b a6a6b6b6c6c6d6d6 e6e6f6f6g6g6h6h6 i6i6j6j6k6k6l6l6 m6m6n6n6o6o6p6p6
  570. ; 32 21x21a a5a5b5b5c5c5d5d5 e5e5f5f5g5g5h5h5 i5i5j5j5k5k5l5l5 m5m5n5n5o5o5p5p5
  571. ; 33 21x21b a4a4b4b4c4c4d4d4 e4e4f4f4g4g4h4h4 i4i4j4j4k4k4l4l4 m4m4n4n4o4o4p4p4
  572. ; 34 22x22a a3a3b3b3c3c3d3d3 e3e3f3f3g3g3h3h3 i3i3j3j3k3k3l3l3 m3m3n3n3o3o3p3p3
  573. ; 35 22x22b a2a2b2b2c2c2d2d2 e2e2f2f2g2g2h2h2 i2i2j2j2k2k2l2l2 m2m2n2n2o2o2p2p2
  574. ; 36 23x23a a1a1b1b1c1c1d1d1 e1e1f1f1g1g1h1h1 i1i1j1j1k1k1l1l1 m1m1n1n1o1o1p1p1
  575. ; 37 23x23b a0a0b0b0c0c0d0d0 e0e0f0f0g0g0h0h0 i0i0j0j0k0k0l0l0 m0m0n0n0o0o0p0p0
  576. ;------------------------------------------------------------------------
  577.  
  578.         swap    d7
  579.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  580.  
  581.         move.l    (a0)+,d0    ; read first 4 (game) pixels
  582.         move.l    (a0)+,d1    ; read first 4 (game) pixels
  583.         move.l    (a0)+,d2    ; read first 4 (game) pixels
  584.  
  585.         move.l    d0,d4
  586.         move.l    d2,d5
  587.  
  588.         and.l    #$f0f0f0f0,d0        ; $f0f0f0f0
  589.         eor.l    d0,d4
  590.         lsl.l    #4,d4
  591.         and.l    #$f0f0f0f0,d5        ; $f0f0f0f0
  592.         eor.l    d5,d2
  593.         lsr.l    #4,d5
  594.         or.l    d5,d0
  595.  
  596.         or.l    d4,d2        ; 00x02 -> 10 11
  597.         move.l    d1,d4
  598.         and.l    #$f0f0f0f0,d1
  599.         eor.l    d1,d4
  600.         lsl.l    #4,d4
  601.  
  602.         move.l    (a0)+,d3    ; read next 4 (game) pixels
  603.  
  604.         move.l    d3,d5
  605.         and.l    #$f0f0f0f0,d5
  606.         eor.l    d5,d3
  607.         lsr.l    #4,d5
  608.         or.l    d5,d1
  609.         or.l    d4,d3        ; 01x03 -> 12 13
  610.  
  611.         move.l    d0,d4
  612.         and.l    #$cccccccc,d0
  613.         eor.l    d0,d4
  614.         lsl.l    #2,d4
  615.         move.l    d1,d5
  616.         and.l    #$cccccccc,d5
  617.         eor.l    d5,d1
  618.         lsr.l    #2,d5
  619.         or.l    d5,d0
  620.         or.l    d4,d1        ; 10x12 -> 20 21
  621.  
  622.         bra    .same_from_here
  623.  
  624.         cnop    0,8
  625.  
  626. .outerloop    swap    d7
  627.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  628.  
  629. .innerloop    move.l    (a0)+,d0    ; read next 4 (game) pixels
  630.         move.l    (a0)+,d1    ; read next 4 (game) pixels
  631.         move.l    (a0)+,d2    ; read next 4 (game) pixels
  632.  
  633.         move.l    d4,(a1)     ; 32 -> plane 5
  634.         adda.l    a6,a1        ; +bpmod
  635.  
  636.         move.l    d0,d4
  637.         and.l    #$f0f0f0f0,d0
  638.         eor.l    d0,d4
  639.         lsl.l    #4,d4
  640.         move.l    d2,d5
  641.         and.l    #$f0f0f0f0,d5
  642.         eor.l    d5,d2
  643.         lsr.l    #4,d5
  644.         or.l    d5,d0
  645.         or.l    d4,d2        ; 00x02 -> 10 11
  646.         move.l    d1,d4
  647.         and.l    #$f0f0f0f0,d1
  648.         eor.l    d1,d4
  649.         lsl.l    #4,d4
  650.  
  651.  
  652.         move.l    d3,(a1)     ; 31 -> plane 6
  653.         adda.l    a6,a1        ; +bpmod
  654.  
  655.         move.l    (a0)+,d3    ; read next 4 (game) pixels
  656.  
  657.         move.l    d3,d5
  658.         and.l    #$f0f0f0f0,d5
  659.         eor.l    d5,d3
  660.         lsr.l    #4,d5
  661.         or.l    d5,d1
  662.         or.l    d4,d3        ; 01x03 -> 12 13
  663.  
  664.         move.l    d0,d4
  665.         and.l    #$cccccccc,d0
  666.         eor.l    d0,d4
  667.         lsl.l    #2,d4
  668.         move.l    d1,d5
  669.         and.l    #$cccccccc,d5
  670.         eor.l    d5,d1
  671.         lsr.l    #2,d5
  672.         or.l    d5,d0
  673.         or.l    d4,d1        ; 10x12 -> 20 21
  674.  
  675.         move.l    d6,(a1)     ; 30 -> plane 7
  676.         adda.l    a4,a1        ; -7*bpmod+4 or
  677.                     ; +linemod-bytesperrow-7*bpmod+4
  678.  
  679. .same_from_here move.l    d2,d4
  680.         and.l    #$cccccccc,d2
  681.         eor.l    d2,d4
  682.         lsl.l    #2,d4
  683.         move.l    d3,d5
  684.         and.l    #$cccccccc,d5
  685.         eor.l    d5,d3
  686.         lsr.l    #2,d5
  687.         or.l    d5,d2
  688.         or.l    d4,d3        ; 11x13 -> 22 23
  689.  
  690.         move.l    d3,d4
  691.         and.l    #$aaaaaaaa,d3
  692.         eor.l    d3,d4
  693.  
  694.         move.l    d4,d5
  695.         add.l    d4,d4
  696.         or.l    d4,d5        ; 23x23b -> 37
  697.  
  698.         move.l    d5,(a1)     ; 37 -> plane 0
  699.         adda.l    a6,a1        ; +bpmod
  700.  
  701.         move.l    d3,d4
  702.         lsr.l    #1,d3
  703.         or.l    d3,d4        ; 23x23a -> 36
  704.         move.l    d2,d5
  705.         and.l    #$aaaaaaaa,d2
  706.         eor.l    d2,d5
  707.  
  708.         move.l    d4,(a1)     ; 36 -> plane 1
  709.         adda.l    a6,a1        ; +bpmod
  710.  
  711.         move.l    d5,d3
  712.         add.l    d5,d5
  713.         or.l    d5,d3        ; 22x22b -> 35
  714.         move.l    d2,d5
  715.         lsr.l    #1,d2
  716.         or.l    d2,d5        ; 22x22a -> 34
  717.  
  718.         move.l    d3,(a1)     ; 35 -> plane 2
  719.         adda.l    a6,a1        ; +bpmod
  720.  
  721.         move.l    d1,d4
  722.         and.l    #$aaaaaaaa,d1
  723.         eor.l    d1,d4
  724.         move.l    d4,d2
  725.         add.l    d4,d4
  726.         or.l    d4,d2        ; 21x21b -> 33
  727.         move.l    d1,d4
  728.  
  729.         move.l    d5,(a1)     ; 34 -> plane 3
  730.         adda.l    a6,a1        ; +bpmod
  731.  
  732.         lsr.l    #1,d1
  733.         or.l    d1,d4        ; 21x21a -> 32
  734.         move.l    d0,d3
  735.         and.l    #$aaaaaaaa,d0
  736.         eor.l    d0,d3
  737.         move.l    d3,d6
  738.  
  739.         move.l    d2,(a1)     ; 33 -> plane 4
  740.         adda.l    a6,a1        ; +bpmod
  741.  
  742.         add.l    d3,d3
  743.         or.l    d6,d3        ; 20x20b -> 31
  744.         move.l    d0,d6
  745.         lsr.l    #1,d0
  746.         or.l    d0,d6        ; 20x20a -> 30
  747.  
  748.         movea.l a3,a4        ; a4 = -7*bpmod+4
  749.  
  750.         dbra    d7,.innerloop
  751.  
  752.         movea.l a5,a4        ; a4 = linemod-bytesperrow-7*bpmod+4
  753.  
  754.         swap    d7
  755.         dbra    d7,.outerloop
  756.  
  757.         move.l    d4,(a1)     ; 32 -> plane 5
  758.         adda.l    a6,a1        ; +bpmod
  759.         move.l    d3,(a1)     ; 31 -> plane 6
  760.         adda.l    a6,a1        ; +bpmod
  761.         move.l    d6,(a1)     ; 30 -> plane 7
  762.         rts
  763.  
  764.         cnop    0,8
  765. doc2p_2X6
  766. ; inputs:
  767. ; a0.l=src chunky buffer
  768. ; a1.l=dest chipmem bitmap
  769. ; d0.w=width (in pixels - multiple of 32) to convert
  770. ; d1.w=height (in pixels - even)
  771. ; d2.l=modulo from one bitplane to next (copmod-ish)
  772. ; d3.l=modulo from start of one line to start of next (linemod)
  773.  
  774. ; Pipelined without fastmem buffers
  775.  
  776.         movea.l d2,a6        ; a6 = bpmod
  777.         move.l    d2,d4
  778.         lsl.l    #2,d4
  779.         add.l    d2,d4
  780.         neg.l    d4
  781.         addq.l    #4,d4
  782.         movea.l d4,a3        ; a3 = -5*bpmod+4
  783.         movea.l d4,a4        ; a4 = -5*bpmod+4
  784.         lsr.w    #4,d0
  785.         movea.w d0,a2
  786.         subq.l    #1,a2        ; a2 = num 16 pix per row - 1
  787.         lsl.w    #2,d0        ; d0 = num 4 pix per row (bytesperrow)
  788.         movea.l d3,a5
  789.         suba.w    d0,a5
  790.         adda.l    a3,a5        ; a5 = linemod-bytesperrow-5*bpmod+4
  791.         move.w    d1,d7
  792.         subq.w    #1,d7        ; d7 = height - 1
  793.  
  794. ;------------------------------------------------------------------------
  795. ; original pixels
  796. ; 00        ....a5a4a3a2a1a0 ....e5e4e3e2e1e0 ....i5i4i3i2i1i0 ....m5m4m3m2m1m0
  797. ; 01        ....b5b4b3b2b1b0 ....f5f4f3f2f1f0 ....j5j4j3j2j1j0 ....n5n4n3n2n1n0
  798. ; 02        ....c5c4c3c2c1c0 ....g5g4g3g2g1g0 ....k5k4k3k2k1k0 ....o5o4o3o2o1o0
  799. ; 03        ....d5d4d3d2d1d0 ....h5h4h3h2h1h0 ....l5l4l3l2l1l0 ....p5p4p3p2p1p0
  800. ;
  801. ; after 4bit merge
  802. ; 10 00x02a ....a5a4....c5c4 ....e5e4....g5g4 ....i5i4....k5k4 ....m5m4....o5o4
  803. ; 11 00x02b a3a2a1a0c3c2c1c0 e3e2e1e0g3g2g1g0 i3i2i1i0k3k2k1k0 m3m2m1m0o3o2o1o0
  804. ; 12 01x03a ....b5b4....d5d4 ....f5f4....h5h4 ....j5j4....l5l4 ....n5n4....p5p4
  805. ; 13 01x03b b3b2b1b0d3d2d1d0 f3f2f1f0h3h2h1h0 j3j2j1j0l3l2l1l0 n3n2n1n0p3p2p1p0
  806. ;
  807. ; after 2bit merge
  808. ; 21 10x12b a5a4b5b4c5c4d5d4 e5e4f5f4g5g4h5h4 i5i4j5j4k5k4l5l4 m5m4n5n4o5o4p5p4
  809. ; 22 11x13a a3a2b3b2c3c2d3d2 e3e2f3f2g3g2h3h2 i3i2j3j2k3k2l3l2 m3m2n3n2o3o2p3p2
  810. ; 23 11x13b a1a0b1b0c1c0d1d0 e1e0f1f0g1g0h1h0 i1i0j1j0k1k0l1l0 m1m0n1n0o1o0p1p0
  811. ;
  812. ; after 1bit merge
  813. ; 32 21x21a a5a5b5b5c5c5d5d5 e5e5f5f5g5g5h5h5 i5i5j5j5k5k5l5l5 m5m5n5n5o5o5p5p5
  814. ; 33 21x21b a4a4b4b4c4c4d4d4 e4e4f4f4g4g4h4h4 i4i4j4j4k4k4l4l4 m4m4n4n4o4o4p4p4
  815. ; 34 22x22a a3a3b3b3c3c3d3d3 e3e3f3f3g3g3h3h3 i3i3j3j3k3k3l3l3 m3m3n3n3o3o3p3p3
  816. ; 35 22x22b a2a2b2b2c2c2d2d2 e2e2f2f2g2g2h2h2 i2i2j2j2k2k2l2l2 m2m2n2n2o2o2p2p2
  817. ; 36 23x23a a1a1b1b1c1c1d1d1 e1e1f1f1g1g1h1h1 i1i1j1j1k1k1l1l1 m1m1n1n1o1o1p1p1
  818. ; 37 23x23b a0a0b0b0c0c0d0d0 e0e0f0f0g0g0h0h0 i0i0j0j0k0k0l0l0 m0m0n0n0o0o0p0p0
  819. ;------------------------------------------------------------------------
  820.  
  821.         swap    d7
  822.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  823.  
  824.         move.l    (a0)+,d0    ; read first 4 (game) pixels
  825.         move.l    (a0)+,d1    ; read first 4 (game) pixels
  826.         move.l    (a0)+,d2    ; read first 4 (game) pixels
  827.  
  828.         move.l    d0,d4
  829.         move.l    d2,d5
  830.  
  831.         and.l    #$f0f0f0f0,d0
  832.         eor.l    d0,d4
  833.         lsl.l    #4,d4
  834.         and.l    #$f0f0f0f0,d5
  835.         eor.l    d5,d2
  836.         lsr.l    #4,d5
  837.         or.l    d5,d0
  838.         or.l    d4,d2        ; 00x02 -> 10 11
  839.         move.l    d1,d4
  840.         and.l    #$f0f0f0f0,d1
  841.         eor.l    d1,d4
  842.         lsl.l    #4,d4
  843.  
  844.         move.l    (a0)+,d3    ; read next 4 (game) pixels
  845.  
  846.         move.l    d3,d5
  847.         and.l    #$f0f0f0f0,d5
  848.         eor.l    d5,d3
  849.         lsr.l    #4,d5
  850.         or.l    d5,d1
  851.         or.l    d4,d3        ; 01x03 -> 12 13
  852.         lsl.l    #2,d0
  853.         or.l    d0,d1        ; 10x12 ->    21
  854.         move.l    d2,d4
  855.         and.l    #$cccccccc,d2
  856.         eor.l    d2,d4
  857.         lsl.l    #2,d4
  858.  
  859.         bra    .same_from_here
  860.  
  861.         cnop    0,8
  862.  
  863. .outerloop    swap    d7
  864.         move.w    a2,d7        ; number of 16 (game) pixels per row - 1
  865.  
  866. .innerloop    move.l    (a0)+,d0    ; read next 4 (game) pixels
  867.         move.l    (a0)+,d1    ; read next 4 (game) pixels
  868.         move.l    (a0)+,d2    ; read next 4 (game) pixels
  869.  
  870.         move.l    d5,(a1)     ; 34 -> plane 3
  871.         adda.l    a6,a1        ; +bpmod
  872.  
  873.         move.l    d0,d4
  874.         and.l    #$f0f0f0f0,d0
  875.         eor.l    d0,d4
  876.         lsl.l    #4,d4
  877.         move.l    d2,d5
  878.         and.l    #$f0f0f0f0,d5
  879.         eor.l    d5,d2
  880.         lsr.l    #4,d5
  881.         or.l    d5,d0
  882.         or.l    d4,d2        ; 00x02 -> 10 11
  883.         move.l    d1,d4
  884.         and.l    #$f0f0f0f0,d1
  885.  
  886.         move.l    d3,(a1)     ; 33 -> plane 4
  887.         adda.l    a6,a1        ; +bpmod
  888.  
  889.         eor.l    d1,d4
  890.         lsl.l    #4,d4
  891.  
  892.         move.l    (a0)+,d3    ; read next 4 (game) pixels
  893.  
  894.         move.l    d3,d5
  895.         and.l    #$f0f0f0f0,d5
  896.         eor.l    d5,d3
  897.         lsr.l    #4,d5
  898.         or.l    d5,d1
  899.         or.l    d4,d3        ; 01x03 -> 12 13
  900.         lsl.l    #2,d0
  901.         or.l    d0,d1        ; 10x12 ->    21
  902.         move.l    d2,d4
  903.         and.l    #$cccccccc,d2
  904.         eor.l    d2,d4
  905.         lsl.l    #2,d4
  906.  
  907.         move.l    d6,(a1)     ; 32 -> plane 5
  908.         adda.l    a4,a1        ; -5*bpmod+4 or
  909.                     ; +linemod-bytesperrow-5*bpmod+4
  910.  
  911. .same_from_here move.l    d3,d5
  912.         and.l    #$cccccccc,d5
  913.         eor.l    d5,d3
  914.         lsr.l    #2,d5
  915.         or.l    d5,d2
  916.         or.l    d4,d3        ; 11x13 -> 22 23
  917.         move.l    d3,d4
  918.         and.l    #$aaaaaaaa,d3
  919.         eor.l    d3,d4
  920.         move.l    d4,d5
  921.         add.l    d4,d4
  922.         or.l    d4,d5        ; 23x23b -> 37
  923.  
  924.         move.l    d5,(a1)     ; 37 -> plane 0
  925.         adda.l    a6,a1        ; +bpmod
  926.  
  927.         move.l    d3,d4
  928.         lsr.l    #1,d3
  929.         or.l    d3,d4        ; 23x23a -> 36
  930.         move.l    d2,d5
  931.         and.l    #$aaaaaaaa,d2
  932.         eor.l    d2,d5
  933.         move.l    d5,d6
  934.         add.l    d5,d5
  935.  
  936.         move.l    d4,(a1)     ; 36 -> plane 1
  937.         adda.l    a6,a1        ; +bpmod
  938.  
  939.         or.l    d5,d6        ; 22x22b -> 35
  940.         move.l    d2,d5
  941.         lsr.l    #1,d2
  942.         or.l    d2,d5        ; 22x22a -> 34
  943.         move.l    d1,d4
  944.         and.l    #$aaaaaaaa,d1
  945.         eor.l    d1,d4
  946.         move.l    d4,d3
  947.  
  948.         move.l    d6,(a1)     ; 35 -> plane 2
  949.         adda.l    a6,a1        ; +bpmod
  950.  
  951.         add.l    d4,d4
  952.         or.l    d4,d3        ; 21x21b -> 33
  953.         move.l    d1,d6
  954.         lsr.l    #1,d1
  955.         or.l    d1,d6        ; 21x21a -> 32
  956.  
  957.         movea.l a3,a4        ; a4 = -5*bpmod+4
  958.  
  959.         dbra    d7,.innerloop
  960.  
  961.         movea.l a5,a4        ; a4 = linemod-bytesperrow-5*bpmod+4
  962.  
  963.         swap    d7
  964.         dbra    d7,.outerloop
  965.  
  966.         move.l    d5,(a1)     ; 34 -> plane 3
  967.         adda.l    a6,a1        ; +bpmod
  968.         move.l    d3,(a1)     ; 33 -> plane 4
  969.         adda.l    a6,a1        ; +bpmod
  970.         move.l    d6,(a1)     ; 32 -> plane 5
  971.         rts
  972.  
  973.         end
  974.